﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "GcmpApiDeclaration.h"

namespace gcmp
{
    class IDrawingLayout;
    class IDocument;
    class IDrawingLayoutEvent;

    /// \brief 图纸管理器
    ///
    /// 图纸管理器负责对图纸进行管理，能创建、删除和查找图纸。
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT IDrawingLayoutManager
    {
    public:
        /// \brief 析构函数
        virtual ~IDrawingLayoutManager();    

        /// \brief 根据文档获取一个图纸管理器。一个文档最多对应一个图纸管理器。
        /// 
        /// \param pDocument 要获得的图纸管理器所对应的文档
        /// \param errorMessage 如果获取文档对应的图纸失败，则返回错误信息。
        /// \return 如果成功，则返回图纸管理器指针；如果失败，则返回nullptr，并且errorMessage返回错误信息。
        static IDrawingLayoutManager* Get(const IDocument* pDocument, std::wstring* errorMessage = nullptr);

        /// \brief 获取图纸事件
        ///
        /// \return 如成功则返回图纸事件接口，失败则返回nullptr。
        static IDrawingLayoutEvent* GetLayoutEvent();

        /// \brief 获取图纸管理器对应的文档。
        ///
        /// \return 图纸管理器对应的文档。
        virtual IDocument* GetDocument() = 0;

        /// \brief 创建一个空图纸
        ///
        /// 图纸的中心固定为（0,0,0）点
        /// \param name 图纸名称
        /// \param errorMessage 输出错误信息，失败情况下获取错误信息
        /// \return 返回图纸指针
        virtual IDrawingLayout* CreateLayout(const std::wstring& name, std::wstring* errorMessage) = 0;

        /// \brief 删除一个图纸
        ///
        /// \param pLayout 要删除的图纸指针
        /// \return 返回true表示删除成功，否则删除失败
        virtual bool DeleteLayout(IDrawingLayout* pLayout) = 0;

        /// \brief 通过图纸名称删除一个图纸
        ///
        /// \param name 要删除的图纸名称
        /// \return 返回true表示删除成功，否则删除失败
        virtual bool DeleteLayout(const std::wstring& name) = 0;

        /// \brief 通过图纸名称获取一个图纸
        ///
        /// \param name 要获取的图纸名称
        /// \return 返回对应的图纸指针
        virtual IDrawingLayout* GetLayout(const std::wstring& name) const = 0;

        /// \brief 获取所有的图纸
        ///
        /// \return 返回所有图纸指针
        virtual std::vector<IDrawingLayout*> GetAllLayouts() const = 0;

    };
}


